package com.orangelife.service.base.dao;

import java.io.Serializable;
import java.util.List;

import com.github.pagehelper.PageInfo;

//import org.apache.ibatis.annotations.Select;

/**
 * 
 * @author LinchunH
 * 
 */

//@Select("MapperGD.find.entityById")

/**
 * GenericDao DAO层泛型接口，定义基本的DAO功能
 * 
 * @author wl
 * @since 0.1
 * @param <T>
 *            实体类
 * @param <PK>
 *            主键类，必须实现Serializable接口
 * 
 * @see com.thinkon.commons.dao.GenericIbatisDao
 */
public interface JdbcGenericDao<T, PK extends Serializable> {
	/**
	 * 保存单一对象
	 * 
	 * @param entity
	 */
	public T save(String methodPath, T entity);

	/**
	 * 更新对象,如果属性为空，则不会进行对应的属性值更新,如果有属性要更新为null，请参看{@link #updateNull(Object)}
	 * 
	 * @param entity
	 *            要更新的实体对象
	 */
	public T update(String methodPath, T entity);

	/**
	 * 
	 * 删除接口 sql的所在接口在xml内的路径
	 * 
	 * @param methodPath
	 * @param entity
	 *            实体
	 */

	public void delete(String methodPath, T entity);

	/**
	 * 查询list接口 sql的所在接口在xml内的路径
	 * 
	 * @param methodPath
	 * @return
	 */

	public List<T> findAll(String methodPath);

	/**
	 * 单个查询 接口
	 * 
	 * @param methodPath
	 *            sql的所在接口在xml内的路径
	 * @param ID
	 *            实体ID
	 * @return
	 */

	public T findById(String methodPath, PK ID);

	/**
	 * 删除接口
	 * 
	 * @param methodPath
	 *            sql的所在接口在xml内的路径
	 * @param ID
	 *            实体ID
	 */

	public void deleteByID(String methodPath, PK ID);

	/**
	 * 
	 * @param result
	 *            根据sql 查询的结果集
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            页面大小
	 * @return
	 */

	public PageInfo<T> findByPage(List<T> result, int pageNo, int pageSize);

	/**
	 * 
	 * 添加实体 采用接口方式
	 * 
	 * @param entity
	 * @return
	 */
	public int save(T entity);

	/**
	 * 更新对象,如果属性为空，则不会进行对应的属性值更新,如果有属性要更新为null，请参看{@link #updateNull(Object)}
	 * 采用接口方式
	 * 
	 * @param entity
	 *            要更新的实体对象
	 */
	public int update(T entity);

	/**
	 * 
	 * 删除实体 采用接口方式
	 * 
	 * @param entity
	 * @return
	 */
	public void delete(T entity);

	/**
	 * 
	 * 查询所有 采用接口方式
	 * 
	 * @param entity
	 * @return
	 */

	public List<T> findAll();

	/**
	 * 查询单个实体采用接口方式
	 * 
	 * @param ID
	 * @return
	 */

	public T findById(PK ID);

	/**
	 * 删除实体 采用接口方式
	 * 
	 * @param ID
	 */

	public void deleteByID(PK ID);

}
